package com.zyf.chapter02.structure.decorator.eureka;


/**
 * 装饰器抽象类
 * @author yifeng
 */
public abstract class HttpClientDecorator implements HttpClient {
    /**
     * TODO 这个接口我咋感觉没啥用呢，为啥不直接用 Httpclient 呢？而是要弄一个匿名类？
     */
	protected interface RequestExecutor {
        String execute(HttpClient delegate);
    }
    // 提供给子类实现
    protected abstract String execute(RequestExecutor executor);

    @Override
    public String getApplications() {
        /**
         * 客户只需要调用 getApplications 即可。
         * 这是一个自动化过程，子类只需要实现自己的逻辑即可，execute 有父类自动为他们调用
         * 这有点像职责链，不停的往下调用 getApplications，
         * 那什么时候停下来呢？当有 delegate#getApplications 开始做实事的时候，
         * 也就是说，delegate 遇到 RestTemplateTransportClient 这样的类就会停下来
         */
        return execute(new RequestExecutor() {
            @Override
            public String execute(HttpClient delegate) {
                return delegate.getApplications();
            }
        });
    }
}
